From 77812987ccab0fd660649f71a4432325cb56ea4d Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 26 Jul 2016 12:55:10 -0700 Subject: [PATCH] Improve file open error when packaging crates Be sure to point to the file in question. Closes #2914 --- src/cargo/ops/cargo_package.rs | 4 +++- tests/package.rs | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index 8201a5fa8..4e6ae0a9d 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -185,7 +185,9 @@ fn tar(ws: &Workspace, human(format!("non-utf8 path in source directory: {}", relative.display())) })); - let mut file = try!(File::open(file)); + let mut file = try!(File::open(file).chain_error(|| { + human(format!("failed to open for archiving: `{}`", file.display())) + })); try!(config.shell().verbose(|shell| { shell.status("Archiving", &relative) })); diff --git a/tests/package.rs b/tests/package.rs index 129b6d243..b953c3916 100644 --- a/tests/package.rs +++ b/tests/package.rs @@ -1,3 +1,4 @@ +#[macro_use] extern crate cargotest; extern crate flate2; extern crate git2; @@ -466,3 +467,39 @@ fn repackage_on_source_change() { }).collect::>(); assert_that(&entry_paths, contains(vec![PathBuf::from("foo-0.0.1/src/foo.rs")])); } + +#[test] +#[cfg(unix)] +fn broken_symlink() { + use std::os::unix::fs; + + let p = project("foo") + .file("Cargo.toml", r#" + [project] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = 'foo' + documentation = 'foo' + homepage = 'foo' + repository = 'foo' + "#) + .file("src/main.rs", r#" + fn main() { println!("hello"); } + "#); + p.build(); + t!(fs::symlink("nowhere", &p.root().join("src/foo.rs"))); + + assert_that(p.cargo("package").arg("-v"), + execs().with_status(101) + .with_stderr_contains("\ +error: failed to prepare local package for uploading + +Caused by: + failed to open for archiving: `[..]foo.rs` + +Caused by: + [..] +")); +} -- 2.30.2